# -*- coding: utf-8 -*-
'''
@author Rafael Passos & Ruben Ribeiro
@date: 3 de Dezembro de 2012
@obs: Método referente à leitura da base de dados sqlite3 (consultas),
e criação/escrita dos ficheiros CSV's com os dados das respectivas
consultas.
'''

import csv
from sqlalchemy import *

	
bd = create_engine('sqlite:///sqlalchemy.db', echo=True)

metadata = MetaData(bd)

dadosinscritos = Table('dadosinscritos', metadata, autoload=True)

class Estatistica1():
	'''
	Classe onde é processada a primeira estatistica:
	Cursos que incluem o termo computadores e informática, 
	em associação com o estabelecimento de ensino, unidade orgânica 
	e anos letivos em que funcionaram.
	'''
	def __init__(self):
		'''
		Constructor da classe Estatistica1.
		'''
		ficheiro_csv_est1 = csv.writer(open("pesquisa1.csv", "wb"), quoting=csv.QUOTE_ALL)
		
		consulta1 = dadosinscritos.select(dadosinscritos.c.Cursos.like(
		'%computadores%') | dadosinscritos.c.Cursos.like(u'%informática%'))

		cols_header = dadosinscritos.c.keys()

		self.inserir_consulta1(consulta1, cols_header, ficheiro_csv_est1)

	def inserir_consulta1(self, consulta1, cols_header, ficheiro_csv_est1):
		'''
		Executa a consulta e insere linha a linha a pesquisa num csv.
		@param consulta1 - comando sql para consulta em sqlalchemy
		@param cols - headers das colunas da tabela
		@param ficheiro_csv_est1 - ficheiro csv com os dados da consulta.
		'''
		self.consulta1 = consulta1
		self.cols_header = cols_header
		self.ficheiro_csv_est1 = ficheiro_csv_est1
		dadoslinha = consulta1.execute()
		for row in dadoslinha:
			linha = []
			linha.append(row[1].encode('utf-8'))
			linha.append(row[2].encode('utf-8'))
			linha.append(row[4].encode('utf-8'))
			
			for n in range(5, 21):
				if not row[n] == '-':
					linha.append(cols_header[n].encode('utf-8'))
					
			ficheiro_csv_est1.writerow(linha)		
			
class Estatistica2():
	'''
	Classe onde é processada a segunda estatistica:
	A quantidade de alunos que se inscreveram nos cursos com 
	computadores e informática ao longo dos anos.
	'''
	def __init__(self):
		'''
		Constructor da classe Estatistica2.
		'''
		ficheiro_csv_est2 = csv.writer(open("pesquisa2.csv", "wb"), quoting=csv.QUOTE_ALL)
		
		consulta2 = dadosinscritos.select(dadosinscritos.c.Cursos.like(
		'%computadores%') | dadosinscritos.c.Cursos.like(u'%informática%'))

		self.inserir_consulta2(consulta2, ficheiro_csv_est2)

	def inserir_consulta2(self, consulta2, ficheiro_csv_est2):
		'''
		Executa a consulta e insere linha a linha a pesquisa num csv.
		@param consulta2 - comando sql para consulta em sqlalchemy
		@param ficheiro_csv_est2 - ficheiro csv com os dados da consulta.
		'''
		self.consulta2 = consulta2
		self.ficheiro_csv_est2 = ficheiro_csv_est2
		dadoslinha = consulta2.execute()
		for row in dadoslinha:
			linhafinal = []
			linhafinal.append(row[4].encode('utf-8'))
			
			for n in range (5, 21):
				if not row[n] == '-':
					linhafinal.append(row[n].encode('utf-8'))
				else:
					linhafinal.append('0')
					
			ficheiro_csv_est2.writerow(linhafinal)

class Estatistica_3_4():
	'''
	Classe onde é processada a terceira e quarta estatistica:
	A quantidade de cursos por nível de formação ao longo dos anos e 
	a quantidade de alunos por nível de formação ao longo dos anos,
	respectivamente.
	'''
	def __init__(self, op):
		'''
		Constructor da classe Estatistica_3_4.
		@param op - Número da coluna na tabela onde vai buscar os valores
		'''
		self.op = op
		nivel_form_col = dadosinscritos.select()		
		if(op == 3):
			ficheiro_csv_est = csv.writer(open("pesquisa3.csv", "wb"),
			 quoting=csv.QUOTE_ALL)
			self.run(nivel_form_col, ficheiro_csv_est, op)
		if(op == 4):
			ficheiro_csv_est = csv.writer(open("pesquisa4.csv", "wb"),
			 quoting=csv.QUOTE_ALL)
			self.run(nivel_form_col, ficheiro_csv_est, op)

	def run(self, nivel_form_col, ficheiro_csv_est, op):
		'''
		Executa a consulta e insere linha a linha a pesquisa num csv.
		@param nivel_form_col - comando sql para consulta em sqlalchemy
		@param ficheiro_csv_est3 - ficheiro csv com os dados da consulta 3
		@param ficheiro_csv_est3 - ficheiro csv com os dados da consulta 4
		@param op - Número da coluna na tabela onde vai buscar os valores
		'''
		self.op = op
		self.nivel_form_col = nivel_form_col
		self.ficheiro_csv_est = ficheiro_csv_est
		nivel_form_linha = nivel_form_col.execute() # executa o comando sql
		nivel_form_repetidos = []

		
		for row in nivel_form_linha:
			nivel_form_repetidos.append(row[3].encode('utf-8'))
		nivel_form_existentes = list(set(nivel_form_repetidos))
		
		for n in range(len(nivel_form_existentes)):
			cursoscol = dadosinscritos.select(dadosinscritos.c.NivelFormacao 
			== nivel_form_existentes[n].decode('utf-8'))
			cursos_activos = []
			cursos_activos.append(nivel_form_existentes[n])
			inscritos_ano = []
			inscritos_ano.append(nivel_form_existentes[n])
			tabela_filtrada = cursoscol.execute() # executa o comando sql
			
			for i in range(5, 21):
				cursos = []
				inscritos = 0
				tabela_filtrada = cursoscol.execute() # executa o comando sql
				
				for row in tabela_filtrada:
					if not row[i] == '-':
						if(op == 3):
							cursos.append(row[4].encode('utf-8'))
						if(op == 4):
							inscritos += float(row[i])
					#cursos = list(set(cursos))
				if(op == 3):
					cursos_activos.append(len(cursos))
				if(op == 4):
					inscritos_ano.append(inscritos)
			if(op == 3):
				ficheiro_csv_est.writerow(cursos_activos)
			if(op == 4):
				ficheiro_csv_est.writerow(inscritos_ano)
